/** 
 * Object.assgin(obj1,obj2,....)
 * 
 * 功能：合并对象  会修改第一个参数，并且把第一个参数返回来
 * 
 * 返回值：第一个参数
 * 
 */

 let obj1 = {
     name:'lili',
     age:10
 };

 let obj2 = {
     name:'lixd',
     age:18,
     sex:'女'
 };

 let obj3 = {};

 let target = Object.assign(obj3,obj1,obj2);  //{name:'lixd',age:18,sex:'女'}

 console.log(target === obj3);

 //rest参数  ...params 

 /**
  * ...参数名  必须放在最后，  值为剩余参数组成的数组
  * 
 */

 function extend(o,...arr){
    arr.forEach(function(item){
        for(let key in item){
            o[key] = item[key];
        }
    })

    return o
 }

 console.log(extend({},obj1,obj2));  //{} 不想修改obj1 obj2


 for(let i in obj1){
     console.log(i); //name age   //可枚举的属性
 }

 console.log(obj1);

 /**
  * Object.getOwnPropertyDescriptor()  获取属性的描述对象
  * 
  * { 
  *     value: 10,              值
        writable: true,         是否可写
        enumerable: true,       是否可枚举
        configurable: true      是否可配置
    }

    Object.defineProperty()   新建属性或修改属性
  * 
 */

 console.log(Object.getOwnPropertyDescriptor(obj1,'age'))

 Object.defineProperty(obj1,'age',
    { 
        value: 10,              
        writable: false,         
        enumerable: true,       
        configurable: false      
    }
 )

//  obj1.age = 20;

delete obj1.age

 Object.defineProperty(obj1,'address',{
     value:'河北省',
     enumerable: true
 })

 console.log(obj1);

 for(let i in obj1){
    console.log(i); //name age   //可枚举的属性
}

/**
 * Object.keys()   //所有的键组成的数组
 * 
 * Object.values() //所有的值组成的数组
 * 
 * Object.entries() //所有的键值组成的数组
 * 
 * */ 
 console.log(Object.keys(obj1));
 console.log(Object.values(obj1));
 console.log(Object.entries(obj1));

 /**
  * Object.is()  判断两个值是否相等
  * 
  * == === 
  * 
  * +0 -0   
  * 
  * NaN 
  * 
 */

 console.log(Object.is(+0,-0));  //false

 console.log(+0 === -0);   //true

 console.log(NaN === NaN); //false

 console.log(Object.is(NaN,NaN)); //true






